001 /**
002 * Created by IntelliJ IDEA.
003 * User: Wei Wang
004 * Date: Dec 1, 2002
005 * Time: 1:16:41 AM
006 */
007
008 package EVolve.visualization.XYViz.ValValViz;
009
010 import EVolve.visualization.*;
011 import EVolve.visualization.Dimension;
012 import EVolve.visualization.VizFactory.VisualizationFactory;
013 import EVolve.Scene;
014 import EVolve.exceptions.VizInfoCreateException;
015 import EVolve.util.painters.MissRatePainter;
016 import EVolve.util.painters.shapes.Line;
017 import EVolve.util.predefinedutils.VizInfo;
018 import EVolve.data.*;
019 import javax.swing.*;
020 import java.awt.*;
021 import java.awt.event.*;
022 import java.util.HashMap;
023
024 public class MissPredictionMetricViz extends ValueValueVisualization {
025 private PredictorFactory[] factory; // predictor factories
026 private Predictor[] predictor; // predictors
027 private JComboBox comboPredictor; // combobox for selecting predictor factory
028 private PredictorFactory selectedFactory; // predictor factory in use
029 private JMenuItem itemSelectTimeFrame;
030 protected static JMenuItem selectionMenu[] = null;
031 private static int SELECT_OPTION;
032 protected JTextField textInterval;
033
034 public MissPredictionMetricViz(PredictorFactory[] factory) {
035 super();
036 interval = 1000;
037 this.factory = factory;
038 SELECT_OPTION = 0x0001;
039 }
040
041 public Dimension[] createDimension() {
042 Dimension[] returnVal = new Dimension[3];
043 xAxis = new ValueDimension();
044 entityIdFilter = new ReferenceDimension();
045 filter2 = new ReferenceDimension();
046
047 returnVal[0] = xAxis;
048 returnVal[1] = entityIdFilter;
049 returnVal[2] = filter2;
050
051 return returnVal;
052 }
053
054 protected void updateConfiguration() {
055 try {
056 if (autoInterval != -1) {
057 interval = autoInterval;
058 autoInterval = -1;
059 } else
060 interval = Integer.parseInt(textInterval.getText());
061
062 super.updateConfiguration();
063 canvas.setName("Bytecode", "Miss rate");
064 } catch (NumberFormatException e) {
065 Scene.showErrorMessage("Interval must be an integer");
066 configure();
067 }
068 }
069
070 protected JPanel createConfigurationPanel() {
071 JPanel configurationPanel = new JPanel(new GridLayout(2, 1, 5, 5));
072
073 selectedFactory = factory[0];
074
075 JPanel panelTop = new JPanel(new FlowLayout());
076 configurationPanel.add(panelTop);
077
078 panelTop.add(new JLabel("Predictor: "));
079
080 comboPredictor = new JComboBox();
081 for (int i = 0; i < factory.length; i++) {
082 comboPredictor.addItem(factory[i].getName());
083 }
084 panelTop.add(comboPredictor);
085
086
087 JPanel panelBottom = new JPanel(new FlowLayout());
088 panelBottom.add(new JLabel("Interval: "));
089
090 textInterval = new JTextField(String.valueOf(interval), 10);
091 panelBottom.add(textInterval);
092
093 configurationPanel.add(panelBottom);
094
095 return configurationPanel;
096 }
097
098 public void preVisualize() {
099 predictor = new Predictor[entityIdFilter.getMaxEntityNumber()];
100 for (int i = 0; i < predictor.length; i++) {
101 predictor[i] = selectedFactory.createPredictor();
102 }
103
104 image = new AutoShapeImage(new Line(0,0,1));
105 xMax = 0;
106 installPainter();
107 super.preVisualize();
108 }
109
110 public void receiveElement(Element element) {
111 if (element.isOptional()) return;
112
113 long temp = xAxis.getField(element);
114 long x = temp / interval;
115 long y = entityIdFilter.getField(element);
116 long z = filter2.getField(element);
117
118 countEvents(temp);
119
120 if (xOffset == -1) xOffset = x;
121 painter.paint(image,x-xOffset,y,filter2.getEntityFromInt((int)z).getId());
122
123 if (temp > xMax) {
124 xMax = temp;
125 }
126 }
127
128 public void visualize() {
129 canvas.setName(xAxis.getName() + " (" + xMax + ")","Miss Prediction rate (" +
130 ((MissRatePainter)painter).getMaxMiss()*100 + "%)");
131 sort();
132 }
133
134 protected void mouseMove(int x, int y) {
135 int X = canvas.getImageX(x);
136 if ((X >= 0) && (X < image.getW())) {
137 Scene.setStatus(((MissRatePainter)painter).getMissrate(X)+"%");
138 } else {
139 Scene.setStatus(" ");
140 }
141 }
142
143 protected void installPainter() {
144 painter = new MissRatePainter(predictor,filter2.getDataFilter().getTargetType());
145 }
146
147 public void makeSelection() {
148 int x1 = canvas.getStartX();
149 int x2 = canvas.getEndX();
150
151 if (dataSourceId != Scene.getDataSourceManager().getCurrentDataSourceId()) {
152 Scene.showErrorMessage("The active data source used currently is different from \n" +
153 "this visualization, please choose \"" +
154 Scene.getDataSourceManager().getUsedDataSourceName(dataSourceId)+"\".");
155 return;
156 }
157
158 if (((x1<0)&&(x2<0)) || ((x1>=timeMap.size()))&&(x2>=timeMap.size()))
159 return;
160
161 if (x1 < 0) {
162 x1 = 0;
163 }
164
165 if (x2 > (timeMap.size() - 1)) {
166 x2 = timeMap.size() - 1;
167 }
168
169 int[] selection = new int[entityIdFilter.getEntityNumber()];
170 for (int i = 0; i < selection.length; i++) {
171 selection[i] = i;
172 }
173
174
175 entityIdFilter.makeSelection(subjectDefinition.getType(),selection,((long[])timeMap.get(x1))[1],
176 ((long[])timeMap.get(x2))[1],timeMap);
177
178 }
179
180 public HashMap getCurrentConfigure() {
181 try {
182 HashMap configure = super.getCurrentConfigure();
183
184 VizInfo vizInfo = new VizInfo();
185 vizInfo.setFactory((VisualizationFactory)configure.get("Factory"));
186 vizInfo.setSubject((ElementDefinition)configure.get("Subject"));
187
188 String[] dimensionDefs = new String[3];
189 dimensionDefs[0] = xAxis.getName() ;
190 dimensionDefs[1] = entityIdFilter.getName() ;
191 dimensionDefs[2] = filter2.getName() ;
192 configure.put("Dimension",vizInfo.createDimension(dimensionDefs));
193 configure.put("Predictor",selectedFactory);
194
195 return configure;
196 } catch (VizInfoCreateException e) {
197 Scene.showErrorMessage(e.getMessage());
198 }
199 return null;
200 }
201
202 public JMenuItem[] createSelectionMenuItem() {
203 itemSelectTimeFrame = new JCheckBoxMenuItem("Time Frame");
204 itemSelectTimeFrame.setMnemonic(KeyEvent.VK_T);
205 itemSelectTimeFrame.setSelected(true);
206 itemSelectTimeFrame.setEnabled(false);
207
208
209 JMenuItem[] items = new JMenuItem[1];
210 items[0] = itemSelectTimeFrame;
211
212 return items;
213 }
214
215 public Object clone() {
216 MissPredictionMetricViz o = (MissPredictionMetricViz) super.clone();
217 o.dimension[0] = o.xAxis;
218 o.dimension[1] = o.entityIdFilter;
219 o.dimension[2] = o.filter2;
220 o.factory = new PredictorFactory[factory.length];
221 for (int i=0; i<factory.length; i++) {
222 o.factory[i] = (PredictorFactory)factory[i].clone();
223 }
224 o.selectedFactory = (PredictorFactory)selectedFactory.clone();
225 if (predictor != null) {
226 o.predictor = new Predictor[predictor.length];
227 for (int i=0; i<predictor.length; i++)
228 o.predictor[i] = (Predictor)predictor[i].clone();
229 }
230 o.createDialog();
231 return o;
232 }
233
234 }